package com.qiandw.enterprise.credit.utils

import java.awt.{Color, Graphics}
import java.util.Random
import javax.servlet.http.HttpServletRequest

/**
  * Created by Draven on 2018/7/12.
  * Email:hjx@qiandw.com
  */
class RandomValidateCodeUtil {

  import org.slf4j.LoggerFactory
  import javax.imageio.ImageIO
  import javax.servlet.http.HttpServletResponse
  import java.awt.Font
  import java.awt.image.BufferedImage

  val RANDOMCODEKEY = "RANDOMVALIDATECODEKEY" //放到session中的key

  private val randString = "0123456789" //随机产生只有数字的字符串 private String

  //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串
  //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
  private val width = 95 // 图片宽

  private val height = 25 // 图片高

  private val lineSize = 40 // 干扰线数量

  private val stringNum = 4 // 随机产生字符数量

  private val logger = LoggerFactory.getLogger(classOf[RandomValidateCodeUtil])

  private val random = new Random

  /**
    * 获得字体
    */
  private def getFont = new Font("Fixedsys", Font.CENTER_BASELINE, 18)

  /**
    * 获得颜色
    */
  private def getRandColor(fc: Int, bc: Int) = {
    var _fc = fc
    var _bc = bc
    if (fc > 255) _fc = 255
    if (bc > 255) _bc = 255
    val r = _fc + random.nextInt(_bc - _fc - 16)
    val g = _fc + random.nextInt(_bc - _fc - 14)
    val b = _fc + random.nextInt(_bc - _fc - 18)
    new Color(r, g, b)
  }

  /**
    * 生成随机图片
    */
  def getRandcode(request: HttpServletRequest, response: HttpServletResponse): Unit = {
    val session = request.getSession
    // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
    val image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR)
    val g = image.getGraphics // 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
    g.fillRect(0, 0, width, height) //图片大小

    g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18)) //字体大小

    g.setColor(getRandColor(110, 133)) //字体颜色

    // 绘制干扰线
    for (i <- 0 to lineSize) {
      drowLine(g)
    }
    // 绘制随机字符
    var randomString = ""
    for (i <- 0 to stringNum) {
      randomString = drowString(g, randomString, i)
    }
    logger.info(randomString)
    //将生成的随机字符串保存到session中
    session.removeAttribute(RANDOMCODEKEY)
    session.setAttribute(RANDOMCODEKEY, randomString)
    g.dispose
    try // 将内存中的图片通过流动形式输出到客户端
    ImageIO.write(image, "JPEG", response.getOutputStream)
    catch {
      case e: Exception =>
        logger.error("将内存中的图片通过流动形式输出到客户端失败>>>>   ", e)
    }
  }

  /**
    * 绘制字符串
    */
  private def drowString(g: Graphics, randomString: String, i: Int) = {
    var _randomString = randomString
    g.setFont(getFont)
    g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)))
    val rand = String.valueOf(getRandomString(random.nextInt(randString.length)))
    _randomString += rand
    g.translate(random.nextInt(3), random.nextInt(3))
    g.drawString(rand, 13 * i, 16)
    _randomString
  }

  /**
    * 绘制干扰线
    */
  private def drowLine(g: Graphics) = {
    val x = random.nextInt(width)
    val y = random.nextInt(height)
    val xl = random.nextInt(13)
    val yl = random.nextInt(15)
    g.drawLine(x, y, x + xl, y + yl)
  }

  /**
    * 获取随机的字符
    */
  def getRandomString(num: Int): String = String.valueOf(randString.charAt(num))
}
